package com.itstyle.seckill.topic.jichu.invoke;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

import java.lang.reflect.Proxy;

/**
 * @Auther: liuwenxiang
 * @Date: 2020/3/20 00:00
 * @Description:
 */
@Component
public class MyBenaPostprossor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }


    /**
     * 注：spring ioc容器，依赖注入,控制反转；
     * 将对象的创建交给spring容器， spring容器会为所有添加spring实例化注解的类，进行实例化，并有spring管理这些对象；
     * 1.spring实例化"每个类"，都会执行一些列后置处理器，在后置处理器中可以添加aop操作。
     * 2.aop:在后置处理器中，为bean添加代理类。
     *
     * @param bean
     * @param beanName
     * @return
     * @throws BeansException
     */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        //返回代理bean
        if(beanName.equals("aopService")){
            //new MyInvocationHandler(bean)   实现InvocationHandler接口，对"对象"做增强处理
            return Proxy.newProxyInstance(MyBenaPostprossor.class.getClassLoader(),new Class[]{Service.class}, new MyInvocationHandler(bean));
        }
        //返回原始bean
        return bean;
    }
}
